package com.hspedu.reflection.question;

import com.hspedu.Cat;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * @author DL5O
 * @version 1.0
 * 反射问题的引入
 */
public class ReflectionQuestion {
    public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        //根据配置文件 re.properties 指定信息，创建cat对象并调用hi方法
        //传统方法 new 一个对象，然后再调用它的方法
        //Cat cat = new Cat();
        //cat.hi(); ==> cat.cry(); 修改源码
        Cat cat = new Cat();
        cat.hi();

        Properties properties = new Properties();
        String filePath = "src\\re.properties";

        properties.load(new FileReader(filePath));
        String classFullPath = properties.getProperty("classfullpath");
        String method = properties.getProperty("method");
        System.out.println("classFullPath=" + classFullPath);
        System.out.println("method=" + method);
//        properties.list(System.out);

        //拿到的路径和方法，都是字符串，无法直接new，我们需要用到反射
        //使用反射机制

        //1.加载类，返回Class类型的对象cls
        Class cls = Class.forName(classFullPath);
        //2.通过cls得到你加载类的 com.hspedu.Cat 对象实例
        Object o = cls.newInstance();
        //3.通过cls得到你加载类的com.hspedu.Cat 的 methodName "hi" 方法对象
        Method method1 = cls.getMethod(method);
        //4.通过method01 来调用方法:即通过方法对象来实现调用方法
        System.out.println("========");
        method1.invoke(o);//传统方法 对象.方法(), 反射机制 方法.invoke(对象)



    }
}
